package vfs.obj.association;

/**
 * The VFSAssociationFactory creates instances of association
 * manipulators in the virtual folder system. Each type of association 
 * manipulator has addition, modification, removal, and querying 
 * methods for the type of association it represents.
 *
 * @author Matthew Eavenson <durandal@uga.edu>
 */
public interface VFSAssociationFactory {
    
    /**
     * Returns a manipulator capable of manipulating the ownership
     * relationship between Nodes and Users.
     * 
     * @return an association manipulator
     */
    VFSNodeOwnedByUser getNodeOwnedByUser();
    
    /**
     * Returns a manipulator capable of manipulating the "readable by" 
     * relationship between Nodes and Groups.
     * 
     * @return an association manipulator
     */
    VFSNodeReadableByGroup getNodeReadableByGroup();
    
    /**
     * Returns a manipulator capable of manipulating the "writable by"
     * relationship between Nodes and Groups.
     * 
     * @return an association manipulator
     */
    VFSNodeWritableByGroup getNodeWritableByGroup();
    
    /**
     * Returns a manipulator capable of manipulating the "has type"
     * relationship between Nodes and Node types.
     * 
     * @return an association manipulator
     */
    VFSNodeToNodeType getNodeToNodeType();
    
    /**
     * Returns a manipulator capable of manipulating the "has parent"
     * relationship between Nodes and other Nodes.
     * 
     * @return an association manipulator
     */
    VFSNodeToParent getNodeToParent();
    
    /**
     * Returns a manipulator capable of manipulating the path
     * relationship between Nodes and their ancestors and descendants.
     * 
     * @return an association manipulator
     */
    VFSPath getPath();
    
    /**
     * Returns a manipulator capable of manipulating the "member of"
     * relationship between Users and Groups.
     * 
     * @return an association manipulator
     */
    VFSUserToGroup getUserToGroup();
    
}
